package designpatterns.behavior;

import com.sun.istack.internal.NotNull;

import java.math.BigDecimal;

/**
 * 策略模式：一个类的行为或其算法可以在运行时更改
 * 优点：1、算法可以自由切换；
 * 2、避免使用多重条件判断；
 * 3、扩展性良好；
 * 缺点：1、策略类会增多；
 * 2、所有策略类都需要对外暴露。
 * 注意事项：如果一个系统的策略多于四个，就需要考虑使用混合模式，解决策略类膨胀的问题
 *
 * @author jack.wu
 * @since 2019/10/29 17:08
 */
public class Strategy {

    public static void main(String[] args) {

        BigDecimal num1 = new BigDecimal(3);
        BigDecimal num2 = new BigDecimal(9);
        Operation operation = new OperationDivide();
        BigDecimal num = operation.doOperation(num1, num2);
        System.out.println(num);
    }
}

interface Operation {

    /**
     * 操作方法
     *
     * @return 结果
     */
    BigDecimal doOperation(@NotNull BigDecimal num1, @NotNull BigDecimal num2);
}

class OperationAdd implements Operation {

    @Override
    public BigDecimal doOperation(@NotNull BigDecimal num1, @NotNull BigDecimal num2) {
        return num1.add(num2);
    }
}

class OperationSubtract implements Operation {

    @Override
    public BigDecimal doOperation(@NotNull BigDecimal num1, @NotNull BigDecimal num2) {
        return num1.subtract(num2);
    }
}

class OperationMultiply implements Operation {

    @Override
    public BigDecimal doOperation(@NotNull BigDecimal num1, @NotNull BigDecimal num2) {
        return num1.multiply(num2);
    }
}

class OperationDivide implements Operation {

    @Override
    public BigDecimal doOperation(@NotNull BigDecimal num1, @NotNull BigDecimal num2) {
        return num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
    }
}
